package com.liming.service.http;

import cn.hutool.http.Method;
import com.liming.service.http.enums.UrlEnum;

import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;

/**
 * @author liming
 * @date 2025/3/19
 */
public interface HttpClient {

    /**
     * 根据 UrlEnum和表单数据进行请求
     *
     * @param urlEnum 请求枚举
     * @param formMap 表单Map
     * @return 响应体JSON
     */
    String requestByEnumWithForm(UrlEnum urlEnum, Map<String, Object> formMap);

    /**
     * 根据 UrlEnum和表单数据进行请求
     *
     * @param urlEnum 请求枚举
     * @param body    请求体
     * @return 响应体JSON
     */
    String requestByEnumWithBody(UrlEnum urlEnum, String body);

    /**
     * 初始化请求
     *
     * @param urlEnum 请求枚举
     * @return HttpRequest
     */
    cn.hutool.http.HttpRequest initRequest(UrlEnum urlEnum);

    /**
     * 初始化请求
     *
     * @param method 请求方法
     * @param url    请求地址
     * @return HttpRequest
     */
    cn.hutool.http.HttpRequest initRequest(Method method, String url);

    /**
     * GET请求
     *
     * @param url 请求地址
     * @return 响应体JSON
     */
    String get(String url);

    /**
     * GET请求
     *
     * @param url   请求地址
     * @param query 请求参数
     * @return 响应体JSON
     */
    String get(String url, Map<String, Object> query);

    /**
     * POST请求
     *
     * @param url   请求地址
     * @param query 请求参数
     * @return 响应体JSON
     */
    String post(String url, Map<String, Object> query);

    /**
     * POST请求
     *
     * @param url  请求地址
     * @param body 请求参数
     * @return 响应体JSON
     */
    String post(String url, String body);

    /**
     * POST请求
     *
     * @param url   请求地址
     * @param query 请求参数
     * @param body  请求参数
     * @return 响应体JSON
     */
    String post(String url, Map<String, Object> query, String body);

    /**
     * PUT请求
     *
     * @param url  请求地址
     * @param body 请求参数
     * @return 响应体JSON
     */
    String put(String url, String body);

    /**
     * DELETE请求
     *
     * @param url   请求地址
     * @param query 请求参数
     * @return 响应体JSON
     */
    String delete(String url, Map<String, Object> query);

    /**
     * DELETE请求
     *
     * @param url  请求地址
     * @param body 请求参数
     * @return 响应体JSON
     */
    String delete(String url, String body);

    String mapToQuery(Map<String, Object> map);

    String mapToQuery(Map<String, Object> map, Charset charset);

    /**
     * 将Map形式的Form表单数据转换为Url参数形式
     * paramMap中如果key为空（null和""）会被忽略，如果value为null，会被做为空白符（""）
     * 会自动url编码键和值 key1=v1&key2=&key3=v3
     *
     * @param map              表单数据
     * @param charset          编码，null表示不encode键值对
     * @param isFormUrlEncoded 是否为x-www-form-urlencoded模式，此模式下空格会编码为'+'
     * @return url参数
     */
    String mapToQuery(Map<String, Object> map, Charset charset, boolean isFormUrlEncoded);

    Map<String, String> queryToMap(String paramsStr);

    Map<String, String> queryToMap(String paramsStr, Charset charset);

    Map<String, List<String>> queryToMapList(String paramsStr);

    Map<String, List<String>> queryToMapList(String paramsStr, Charset charset);

    Map<String, List<String>> queryToMapList(String paramsStr, Charset charset, boolean isFormUrlEncoded);

    boolean isHttp(String url);

    boolean isHttps(String url);
}
